package br.org.isvi.interpretador.portugol.operations;

import br.org.isvi.interpretador.portugol.InterpreterResolver;
import br.org.isvi.interpretador.portugol.OperationResolver;
import br.org.isvi.interpretador.portugol.exception.SemanticErrorException;
import br.org.isvi.interpretador.portugol.types.BooleanSymbol;
import br.org.isvi.interpretador.portugol.types.Kind;
import br.org.isvi.interpretador.portugol.types.Symbol;

public class NotResolver implements OperationResolver {
	
	public NotResolver() {
		super();
	}

	public Symbol execute() {
		
		Symbol value = InterpreterResolver.instance.popStack();
		
		if(UtilsValidator.getRealVariableValue(value).getKind() != Kind.BOOLEANO)
			throw new SemanticErrorException("O Tipo " + UtilsValidator.getRealVariableValue(value).getKind() + " não é compatível para esta operação!");
	
		
		return new BooleanSymbol(!(Boolean)UtilsValidator.getRealVariableValue(value).getValue());
	}

}
